<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  <title>Value-based Classes</title> 
  <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
 </head> 
 <body> 
  <h2 id="ValueBased">Value-based Classes</h2> Some classes, such as 
  <code>java.util.Optional</code> and 
  <code>java.time.LocalDateTime</code>, are 
  <em>value-based</em>. Instances of a value-based class: 
  <ul> 
   <li>are final and immutable (though may contain references to mutable objects);</li> 
   <li>have implementations of <code>equals</code>, <code>hashCode</code>, and <code>toString</code> which are computed solely from the instance's state and not from its identity or the state of any other object or variable;</li> 
   <li>make no use of identity-sensitive operations such as reference equality (<code>==</code>) between instances, identity hash code of instances, or synchronization on an instances's intrinsic lock;</li> 
   <li>are considered equal solely based on <code>equals()</code>, not based on reference equality (<code>==</code>);</li> 
   <li>do not have accessible constructors, but are instead instantiated through factory methods which make no committment as to the identity of returned instances;</li> 
   <li>are <em>freely substitutable</em> when equal, meaning that interchanging any two instances <code>x</code> and <code>y</code> that are equal according to <code>equals()</code> in any computation or method invocation should produce no visible change in behavior. </li> 
  </ul> 
  <p>A program may produce unpredictable results if it attempts to distinguish two references to equal values of a value-based class, whether directly via reference equality or indirectly via an appeal to synchronization, identity hashing, serialization, or any other identity-sensitive mechanism. Use of such identity-sensitive operations on instances of value-based classes may have unpredictable effects and should be avoided.</p>  
 </body>
</html>